package br.com.jvet.entidade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import br.com.jvet.constante.StatusPedido;

@Entity
@Table(name = "tbitempedidocompra")
@SequenceGenerator(name = "itempedido_seq", sequenceName = "itempedido_seq", initialValue = 1, allocationSize = 1)
public class ItemPedidoCompra implements Serializable {

	private static final long serialVersionUID = 1158504471051950095L;
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "itempedido_seq")
	private int codigo;
	@OneToOne
	private Produto produto;
	@Column(length = 100)
	private String observacao;
	@Column(precision = 2)
	private double quantidade;
	@Column(precision = 2)
	private double preco;
	@Column(precision = 2)
	private double ipi;
	@Column(precision = 2)
	private double icms;
	@Temporal(TemporalType.DATE)
	private Date dataPrevisao;
	@Temporal(TemporalType.DATE)
	private Date dataRecebimento;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private StatusPedido status;
	@ManyToOne
	private PedidoCompra pedidoCompra;
	@Transient
	private double precoTotal;
	@Transient
	private double qtdRecebida;
	@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
	private List<Movimentacao> movimentacoes;
	@Transient
	private double totalRecebido;

	public ItemPedidoCompra() {
		super();
		produto = new Produto();
		status = StatusPedido.PENDENTE;
		movimentacoes = new ArrayList<Movimentacao>();
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public double getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(double quantidade) {
		this.quantidade = quantidade;
	}

	public double getPreco() {
		return preco;
	}

	public void setPreco(double preco) {
		this.preco = preco;
	}

	public double getIpi() {
		return ipi;
	}

	public void setIpi(double ipi) {
		this.ipi = ipi;
	}

	public double getIcms() {
		return icms;
	}

	public void setIcms(double icms) {
		this.icms = icms;
	}

	public StatusPedido getStatus() {
		return status;
	}

	public void setStatus(StatusPedido status) {
		this.status = status;
	}

	public Date getDataPrevisao() {
		return dataPrevisao;
	}

	public void setDataPrevisao(Date dataPrevisao) {
		this.dataPrevisao = dataPrevisao;
	}

	public Date getDataRecebimento() {
		return dataRecebimento;
	}

	public void setDataRecebimento(Date dataRecebimento) {
		this.dataRecebimento = dataRecebimento;
	}

	/** valor do ipi */
	public double calculaIpi() {
		return (preco * quantidade) * getIpi();
	}

	/** valor do icms */
	public double calculaIcms() {
		return (preco * quantidade) * getIcms();
	}

	public double totalComIpi() {
		double valor = calculaIpi();
		return valor + (preco * quantidade);
	}

	public PedidoCompra getPedidoCompra() {
		return pedidoCompra;
	}

	public void setPedidoCompra(PedidoCompra pedidoCompra) {
		this.pedidoCompra = pedidoCompra;
	}

	public double getPrecoTotal() {
		if (preco > 0) {
			precoTotal = (preco + (preco * ipi / 100)) * quantidade;
		}
		return precoTotal;
	}

	public void setPrecoTotal(double precoTotal) {
		this.precoTotal = precoTotal;
	}

	public double getQtdRecebida() {
		return qtdRecebida;
	}

	public void setQtdRecebida(double qtdRecebida) {
		this.qtdRecebida = qtdRecebida;
	}

	public List<Movimentacao> getMovimentacoes() {
		return movimentacoes;
	}

	public void setMovimentacoes(List<Movimentacao> movimentacoes) {
		this.movimentacoes = movimentacoes;
	}

	public double getTotalRecebido() {
		return totalRecebido;
	}

	public void setTotalRecebido(double totalRecebido) {
		this.totalRecebido = totalRecebido;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		result = prime * result + ((produto == null) ? 0 : produto.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ItemPedidoCompra other = (ItemPedidoCompra) obj;
		if (codigo != other.codigo)
			return false;
		if (produto == null) {
			if (other.produto != null)
				return false;
		} else if (!produto.equals(other.produto))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "ItemPedidoCompra [codigo=" + codigo + ", produto=" + produto
				+ ", observacao=" + observacao + ", quantidade=" + quantidade
				+ ", preco=" + preco + ", ipi=" + ipi + ", icms=" + icms
				+ ", dataPrevisao=" + dataPrevisao + ", dataRecebimento="
				+ dataRecebimento + ", status=" + status + ", pedidoCompra="
				+ pedidoCompra + "]";
	}

	public ItemPedidoCompra clone() {
		ItemPedidoCompra item = new ItemPedidoCompra();
		item.setCodigo(codigo);
		item.setDataPrevisao(dataPrevisao);
		item.setDataRecebimento(dataRecebimento);
		item.setIcms(icms);
		item.setIpi(ipi);
		item.setObservacao(observacao);
		item.setPreco(preco);
		item.setProduto(produto);
		item.setQuantidade(quantidade);
		item.setStatus(status);
		item.setPedidoCompra(pedidoCompra);
		item.setPrecoTotal(precoTotal);
		item.setQtdRecebida(qtdRecebida);
		item.setMovimentacoes(movimentacoes);
		item.setTotalRecebido(totalRecebido);
		return item;
	}

}
